package controller;

import interfaz.IRepresentacionesDeDiagrama;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.swing.JOptionPane;

import constants.DiagramaConstants;

import utils.Mensaje;
import view.Pantalla;
import view.entidad.NuevaJerarquiaDialogo;
import view.relacion.EditarRelacionDialogo;
import view.relacion.NuevaRelacionDialogo;
import model.Atributo;
import model.AtributoCompuesto;
import model.Coordenada;
import model.Diagrama;
import model.Entidad;
import model.Jerarquia;
import model.Proyecto;
import model.Relacion;

public class ManagerRelacion implements IRepresentacionesDeDiagrama {
	private Diagrama diagramaActual;
	private ManagerAreaDeTrabajo areaDeTrabajo = ManagerAreaDeTrabajo.getInstance();
	private Relacion modelRelacion;
	private Atributo modelAtributo;
	private AtributoCompuesto modelAtributoCompuesto;
	private NuevaRelacionDialogo vistaNuevaRelacion;
	private EditarRelacionDialogo vistaEditarRelacion;
	private Proyecto proyecto;
	private Pantalla pantalla = Pantalla.getPantalla();
	private String nombreConReferencia = "";
	private ManagerAreaDeTrabajo controladorAreaDeTrabajo = ManagerAreaDeTrabajo.getInstance();
	
	public ManagerRelacion(){
		
	}
	
	public void setVistaNuevaRelacion(NuevaRelacionDialogo vistaNuevaRelacion, Proyecto proyecto, Diagrama diagramaEnPantalla) {
		this.vistaNuevaRelacion = vistaNuevaRelacion;
		this.proyecto = proyecto;
		this.diagramaActual = diagramaEnPantalla;
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<String> getEntidadesDelDiagrama(){
		
		if (diagramaActual.getListaEntidades()!= null)
		{
			List<String> lista = new ArrayList<String>(); 
			
		    for(String entidad: diagramaActual.getListaEntidades()){
		    	lista.add(entidad);
		    }
		      Collections.sort(lista, new Comparator() {  
	        	  
		            public int compare(Object o1, Object o2) {  
		                String nombre1 = (String) o1;  
		                String nombre2 = (String) o2;  
		                return nombre1.compareToIgnoreCase(nombre2);  
		            }  
		        });  
		
		      return lista;
		}
		else return null;
	}
	
	public void agregarRelacion(Relacion relacion) {
		
        diagramaActual.getListaRelaciones().add(relacion);
		Coordenada coordenada = new Coordenada(15,15,relacion.getIdentificator().length()*5,relacion.getIdentificator().length()*5,Relacion.class);
		areaDeTrabajo.dibujarRelacion(relacion, coordenada );
		
	}
	
	public EditarRelacionDialogo getVistaEditarRelacion() {
		return vistaEditarRelacion;
	}

	public void setVistaEditarRelacion(EditarRelacionDialogo vistaEditarRelacion, Proyecto proyecto, Diagrama diagramaEnPantalla) {
		this.vistaEditarRelacion = vistaEditarRelacion;
		this.proyecto = proyecto;
		this.diagramaActual = diagramaEnPantalla;
	}
	
	
	public void getListenerBotonAgregarAtributo(){
		//TODO: Ver que no llegue el nombre del atributo con la cardinalidad!, aplicar funcion quitarCardinalidadAlNombreDelAtributo.
		boolean atributoExistente = false;
        //Si el atributo que esta ingresando existe entonces emito un mensaje de error.				    
		for(Relacion relacion: this.diagramaActual.getListaRelaciones()){
			if(relacion.getNombre().equals(vistaEditarRelacion.getNombreEntidad())){
				for (Atributo atributo: relacion.getListaAtributos()){
					  if (atributo.getNombre().equals(vistaEditarRelacion.getNombreAtributo()))
						  atributoExistente = true;
				   }
				for (AtributoCompuesto atributoCompuesto: relacion.getListaAtributosCompuestos()){
					  if (atributoCompuesto.getNombre().equals(vistaEditarRelacion.getNombreAtributo()))
						  atributoExistente = true;
				   }
			
				}
			}
		
		if (atributoExistente){
			JOptionPane.showMessageDialog(vistaEditarRelacion, Mensaje.ATRIBUTO_EXISTENTE,Mensaje.MENSAJE_ERROR,
                    JOptionPane.INFORMATION_MESSAGE);
		}
		else {
		
			Relacion modelRelacion = new Relacion("");
			for(Relacion relacion: diagramaActual.getListaRelaciones()){
					 if (relacion.getIdentificator().equals(vistaEditarRelacion.getNombreEntidad())){
						 modelRelacion = relacion;
					 }
				}
			
			Object relacion = pantalla.getAreaDeTrabajo().getGraphComponent().getGraph().getSelectionCell();
			
			
			if(!vistaEditarRelacion.getNombreAtributo().equals("")){
				
				nombreConReferencia = this.getReferenciaAlOrigenAlEditarElemento(); 
			
			
				if(vistaEditarRelacion.getComposicion().equals("Compuesto")){
				
					modelAtributoCompuesto = new  AtributoCompuesto( vistaEditarRelacion.getNombreAtributo(),
																		  vistaEditarRelacion.getTipoAtributo(),
																		  vistaEditarRelacion.getTipoDeDato(),
																		  vistaEditarRelacion.getCardinalidad(),
																		  vistaEditarRelacion.getComposicion(),
																		  vistaEditarRelacion.getIdentificador());
		        
					modelRelacion.getListaAtributosCompuestos().add(modelAtributoCompuesto);
				
					Coordenada coordenadaAtributoCompuesto = new Coordenada(10,10,25,(modelAtributoCompuesto.getNombre().length() + modelAtributoCompuesto.getCardinalidad().length())*10,AtributoCompuesto.class);
				
					controladorAreaDeTrabajo.dibujarAtributoCompuesto(relacion, modelAtributoCompuesto, coordenadaAtributoCompuesto,nombreConReferencia);
				} 
				else if(vistaEditarRelacion.getComposicion().equals("Simple")){
					
					nombreConReferencia = this.getReferenciaAlOrigenAlEditarElemento(); 
									
					modelAtributo = new Atributo( vistaEditarRelacion.getNombreAtributo(),
												   vistaEditarRelacion.getTipoAtributo(),
												   vistaEditarRelacion.getTipoDeDato(),
												   vistaEditarRelacion.getCardinalidad(),
												   vistaEditarRelacion.getComposicion(),
												   vistaEditarRelacion.getIdentificador());
			    
				modelRelacion.getListaAtributos().add(modelAtributo);
				
				Coordenada coordenadaAtributo = new Coordenada(10,10,25,(modelAtributo.getNombre().length() + modelAtributo.getCardinalidad().length())*10,Atributo.class);
				
				controladorAreaDeTrabajo.dibujarAtributo(relacion, modelAtributo, coordenadaAtributo,nombreConReferencia);
		        
//				controladorDeAtributo.setEntidad(modelEntidad);
			   }
			}
		}
	}
	
	@Override
	public String getReferenciaAlOrigenAlEditarElemento() {
		return nombreConReferencia = DiagramaConstants.RELACION + ":" + vistaEditarRelacion.getNombreEntidad() + "." +
		vistaEditarRelacion.getComposicion() + ":" + vistaEditarRelacion.getNombreAtributo(); 
	}

	@Override
	public String getReferenciaAlOrigenAlCrearElemento() {
		return "";
	}

	public boolean existeRelacionEnDiagramaActual(String relacion){
		return diagramaActual.existeRelacionEnDiagramaActual(relacion);
	}
	
}
